home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / tex / td187src.lzh / OWNBOXES.I < prev    next >
Text File  |  1991-12-14  |  14KB  |  413 lines

  1. IMPLEMENTATION MODULE OwnBoxes;
  2.  
  3. FROM SYSTEM       IMPORT ADR;
  4. FROM CommonData   IMPORT ClipXY, SnapMode, SnapX, SnapY,
  5.                          XSnap, YSnap, InternalResolution,
  6.                          WindowHandle;
  7. FROM Variablen    IMPORT NumberToStr, Position, PicToPix, PixToPic;
  8. IMPORT MagicAES, MagicVDI, MagicSys;
  9. IMPORT MagicStrings, MagicConvert;
  10. IMPORT mtAppl;
  11. IMPORT Diverses;
  12. IMPORT MathLib0;
  13. (*
  14. IMPORT PDebug;
  15. *)
  16.  
  17. PROCEDURE SetMousePos(X, Y : INTEGER);
  18. VAR idummy : INTEGER;
  19.     bdummy : BITSET;
  20.     cdummy : CHAR;
  21. BEGIN
  22.   (* Tja, wie geht das nur ? *)
  23.   (* nach ST-Computer 11/88 S.183 *)
  24.   (* put mouse in sample mode *)
  25.   idummy := MagicVDI.SetInputmode(mtAppl.VDIHandle, MagicVDI.Mouse, MagicVDI.Sample);
  26.   bdummy := MagicVDI.InputLocatorSM(mtAppl.VDIHandle, X, Y, idummy, idummy, cdummy);
  27.   (* put mouse in request mode *)
  28.   idummy := MagicVDI.SetInputmode(mtAppl.VDIHandle, MagicVDI.Mouse, MagicVDI.Request);
  29. END SetMousePos;
  30.  
  31. PROCEDURE GetMKState(VAR MoX, MoY      : INTEGER;
  32.                      VAR MoBut, KState : BITSET );
  33. BEGIN
  34.   MagicVDI.SampleKeyboard(mtAppl.VDIHandle, KState);
  35.   MagicVDI.SampleMouse(mtAppl.VDIHandle, MoBut, MoX, MoY);
  36. END GetMKState;
  37.  
  38.  
  39. PROCEDURE MousePos ( VAR PixMouseX, PixMouseY : INTEGER;
  40.                      VAR PicMouseX, PicMouseY : INTEGER;
  41.                      VAR LeftButtonPressed    : BOOLEAN;
  42.                      VAR RightButtonPressed   : BOOLEAN);
  43. (* Berücksichtigt SnapMode *)
  44. VAR xpix, ypix, oldx, oldy, xpic, ypic, x, y, z : INTEGER; but, key : BITSET;
  45. BEGIN
  46.   GetMKState(xpix, ypix, but, key);
  47.   PixToPic(xpix, ypix, xpic, ypic);
  48.   IF SnapMode AND NOT (MagicAES.KCTRL IN key) THEN
  49.     (* Runde auf nächsten Wert *)
  50.     oldx := xpic;
  51.     oldy := ypic;
  52.     IF XSnap THEN
  53.       z := ABS(xpic);
  54.       x := z DIV (SnapX * InternalResolution);
  55.       y := x * SnapX * InternalResolution;
  56.       IF (z - y) > ((SnapX * InternalResolution) DIV 2) THEN
  57.         INC(x);
  58.       END;
  59.       IF xpic<0 THEN
  60.         xpic := - x * SnapX * InternalResolution;
  61.        ELSE
  62.         xpic :=  x * SnapX * InternalResolution;
  63.       END;
  64.     END;
  65.  
  66.     IF YSnap THEN
  67.       z := ABS(ypic);
  68.       x := z DIV (SnapY * InternalResolution);
  69.       y := x * SnapY * InternalResolution;
  70.       IF (z - y) > ((SnapY * InternalResolution) DIV 2) THEN
  71.         INC(x);
  72.       END;
  73.       IF ypic<0 THEN
  74.         ypic := - x * SnapY * InternalResolution;
  75.        ELSE
  76.         ypic :=  x * SnapY * InternalResolution;
  77.       END;
  78.     END;
  79.  
  80.     PicToPix(x, y, xpic, ypic);
  81.  
  82.     IF oldx<>xpic THEN
  83.       xpix := x;
  84.     END;
  85.     IF oldy<>ypic THEN
  86.       ypix := y;
  87.     END;
  88.   END;
  89.   LeftButtonPressed  := MagicAES.MouseLeft  IN but;
  90.   RightButtonPressed := MagicAES.MouseRight IN but;
  91.   PixMouseX := xpix;
  92.   PixMouseY := ypix;
  93.   PicMouseX := xpic;
  94.   PicMouseY := ypic;
  95. END MousePos;
  96.  
  97. PROCEDURE WaitForDepress(VAR x, y : INTEGER);
  98. VAR dum : INTEGER; lbut, rbut : BOOLEAN;
  99. BEGIN
  100.   REPEAT
  101.     MousePos(x, y, dum, dum, lbut, rbut);
  102.   UNTIL NOT lbut;
  103. END WaitForDepress;
  104.  
  105. PROCEDURE ChangeBox(   StartX, StartY : INTEGER;
  106.                     VAR Width, Heigth : INTEGER;
  107.                     ChangeX, ChangeY  : BOOLEAN;
  108.                     RevrsSignAllowed  : BOOLEAN;
  109.                     ShowPercentage    : BOOLEAN);
  110. (* Erlaubt das Aussehen des Rechtecks zu verändern. Die Flags geben
  111.    an, ob eine Änderung in der entsprechenden Richtung erlaubt ist *)
  112. VAR i, dum, dumx, dumy,
  113.     x, y, xo, yo        : INTEGER;
  114.     pxy                 : ARRAY [0..3] OF INTEGER;
  115. (**
  116.     but, key            : BITSET;
  117. **)
  118.     xy, xyo             : ARRAY [0..9] OF INTEGER;
  119.     DelX, DelY          : INTEGER;
  120.     StartWd, StartHt    : INTEGER;
  121.     LeftBut, RightBut   : BOOLEAN;
  122.     txt, tmp            : ARRAY [0..59] OF CHAR;
  123.     factor              : LONGREAL;
  124.  
  125.  
  126.     PROCEDURE AddReal(r : LONGREAL; aftcom : CARDINAL; VAR str : ARRAY OF CHAR);
  127.     VAR i, len           : CARDINAL;
  128.         prezero, aftzero : INTEGER;
  129.         tmpreal          : LONGREAL;
  130.         blank            : ARRAY [0..1] OF CHAR;
  131.         tmpstr           : ARRAY [0..19] OF CHAR;
  132.     BEGIN
  133.       blank := ' ';
  134.       prezero := Diverses.round(MathLib0.int(r));
  135.       tmpreal := MathLib0.fraction(r);
  136.       FOR i:=1 TO aftcom DO
  137.         tmpreal := tmpreal * 10.0;
  138.       END;
  139.       aftzero := Diverses.round(tmpreal);
  140.  
  141.       MagicConvert.IntToStr(prezero, 6, tmpstr);
  142.       MagicStrings.Append(tmpstr, str);
  143.       len := MagicStrings.Length(str);
  144.       str[len]   := '.';
  145.       str[len+1] := 0C;
  146.       MagicConvert.IntToStr(aftzero, aftcom, tmpstr);
  147.       FOR i:=0 TO MagicStrings.Length(tmpstr) DO
  148.         IF tmpstr[i] = ' ' THEN tmpstr[i] := '0'; END;
  149.       END;
  150.       MagicStrings.Append(tmpstr, str);
  151.     END AddReal;
  152.  
  153.     PROCEDURE NoRev(xy, StartXY, StartExt : INTEGER) : BOOLEAN;
  154.     VAR delta : INTEGER;
  155.     BEGIN
  156.       IF RevrsSignAllowed OR (StartExt = 0) THEN
  157.         RETURN TRUE;
  158.        ELSE
  159.         delta := xy - StartXY;
  160.         IF delta=0 THEN
  161.           RETURN TRUE;
  162.          ELSE
  163.           RETURN NOT
  164.            (((delta<0) AND (StartExt>0)) OR
  165.             ((delta>0) AND (StartExt<0)));
  166.         END;
  167.       END;
  168.     END NoRev;
  169.  
  170. BEGIN
  171. (*
  172.   IF ChangeX THEN
  173.     PDebug.Message('X darf verändert werden.');
  174.   END;
  175.   IF ChangeY THEN
  176.     PDebug.Message('Y darf verändert werden.');
  177.   END;
  178.   PDebug.ShowWord('StartX = ', StartX);
  179.   PDebug.ShowWord('StartY = ', StartY);
  180.   PDebug.ShowWord('Width  = ', Width);
  181.   PDebug.ShowWord('Heigth = ', Heigth);
  182. *)
  183.   StartWd := Width;  IF StartWd = 0 THEN StartWd := 1; END;
  184.   StartHt := Heigth; IF StartHt = 0 THEN StartHt := 1; END;
  185.   MagicVDI.SetLineEndstyles      ( mtAppl.VDIHandle , MagicVDI.Cornerd , MagicVDI.Cornerd ) ;
  186.   dum := MagicVDI.SetLinetype   ( mtAppl.VDIHandle , MagicVDI.User ) ;
  187.   i := 5555H; (* ...... *)
  188.   MagicVDI.SetUserlinestyle   ( mtAppl.VDIHandle , i ) ;
  189.   dum := MagicVDI.SetLinewidth  ( mtAppl.VDIHandle , 1 ) ;
  190.   dum := MagicVDI.SetLinecolor ( mtAppl.VDIHandle , MagicAES.BLACK ) ;
  191.  
  192.   FOR i := 0 TO 4 DO
  193.     xy  [ 2*i ]     := StartX ;
  194.     xy  [ 2*i + 1 ] := StartY ;
  195.   END ;
  196.   xy[2] := xy[2] + Width;   xy[4] := xy[4] + Width;
  197.   xy[5] := xy[5] + Heigth;  xy[7] := xy[7] + Heigth;
  198.   FOR i:=0 TO 9 DO
  199.     xyo[i] := xy[i];
  200.   END;
  201.   xo := StartX ; yo:=StartY ;
  202.   dum := MagicVDI.SetWritemode ( mtAppl.VDIHandle , MagicVDI.XOR ) ;
  203.   MagicVDI.SetClipping ( mtAppl.VDIHandle , ClipXY , TRUE ) ;
  204.   Diverses.MouseOff;
  205.   MagicVDI.Polyline ( mtAppl.VDIHandle , 5 , xyo ) ; (* erstmals zeichnen  *)
  206.   Diverses.MouseFinger;
  207.   MagicVDI.SetClipping ( mtAppl.VDIHandle , ClipXY , FALSE) ;
  208.   DelX := StartX; DelY := StartY;
  209. (**
  210.   GetMKState(x, y, but, key);
  211. **)
  212.   MousePos ( x, y, dumx, dumy, LeftBut, RightBut);
  213. (**
  214.   WHILE (MagicAES.MouseLeft IN but) DO  (* linke Taste ist gedrückt *)
  215. **)
  216.   WHILE (LeftBut) DO  (* linke Taste ist gedrückt *)
  217.  
  218.     IF (( x <> xo ) AND ChangeX) OR
  219.        (( y <> yo ) AND ChangeY) THEN
  220.       IF ChangeX AND NoRev(x, StartX, StartWd) THEN
  221.         xy [ 2 ] := x ; xy [ 4 ] := x ;
  222.        ELSE
  223.         DelX := x;
  224.       END;
  225.       IF ChangeY AND NoRev(y, StartY, StartHt) THEN
  226.         xy [ 5 ] := y ; xy [ 7 ] := y ;
  227.        ELSE
  228.         DelY := y;
  229.       END;
  230.       IF ChangeX AND ChangeY AND LeftBut AND RightBut THEN
  231.         (* proportionales Aufziehen *)
  232.         (* muß noch implementiert werden *)
  233.       END;
  234.  
  235.       Position (TRUE, x, y, DelX, DelY ) ;
  236.  
  237.       IF ShowPercentage THEN
  238.         (* jetzt gib noch in die Info-Zeile des Fensters den
  239.            momentanen Änderungsfaktor aus... *)
  240.         txt := 'X: ';
  241.         i := ABS(xy[2] - StartX);
  242.         factor := MathLib0.real(i) / MathLib0.real(StartWd) * 100.0;
  243.         AddReal(factor, 2, txt);
  244.         MagicStrings.Append('%, Y: ', txt);
  245.         i := ABS(xy[5] - StartY);
  246.         factor := MathLib0.real(i) / MathLib0.real(StartHt) * 100.0;
  247.         AddReal(factor, 2, txt);
  248.         MagicStrings.Append(tmp, txt);
  249.         MagicStrings.Append('% ', txt);
  250.         pxy[0] := MagicSys.CastToInt(ADR ( txt ) DIV 10000H);
  251.